/**
 * @file element_niveau.h
 * Definit les caracteristiques des éléments du niveau.
 */
#ifndef _LISTE_TERRAIN_H
#define _LISTE_TERRAIN_H

#include "terrain.h"
#include <iostream>
/**
* @struct element_niveau
* @brief tout ce passe dans un même niveau
*/
struct element_niveau
{
       Terrain* ter;///@param ter Terrain* pointeur du terrain sur lequel se trouve le héros
       int numTer;///@param numTer entier indique le numero du terrains
       element_niveau* suivant;///@param suivant element_niveau* pointeur sur le prochain élement du niveau si il existe
       element_niveau* precedant;///@param precedant element_niveau* pointeur sue l'élement du niveau précédent s'il existe
};

/**
@brief cree une liste de terrain d'un niveau
@param FILE* f, entier nbrTer, element_niveau precedent
@return pointeur sur element_niveau
*/
element_niveau* creerElementNiveau(FILE* f,int nbrTer,element_niveau* precedent);

/**
@brief supprime une liste de terrain
@param element_niveau* eleniv
@return none
*/
void supprimeElementNiveau(element_niveau* eleniv);

/**
@brief affiche la liste de terrain d'un niveau
@param element_niveau* eleniv
@return none
*/
void afficheElementNiveau(element_niveau* eleniv);

/**
@brief recupère le terrain d'un niveau
@param element_niveau* constante eleniv
@return pointeur sur Terrain
*/
Terrain* elementNiveauGetTerrain(const element_niveau* eleniv);

/**
@brief recupère le numero du terrain
@param element_niveau* constante eleniv
@return entier
*/
int elementNiveauGetNumTer(const element_niveau* eleniv);

/**
@brief recupère le terrain suivant
@param element_niveau* constante eleniv
@return pointeur sur element_niveau
*/
element_niveau* elementNiveauGetSuivant(const element_niveau* eleniv);

/**
@brief recupère le terrain precedent
@param element_niveau* constante eleniv
@return pointeur sur element_niveau
*/
element_niveau* elementNiveauGetPrecedant(const element_niveau* eleniv);

/**
@brief change le terrain
@param element_niveau* eleniv, Terrain* ter
@return none
*/
void elementNiveauSetTerrain(element_niveau* eleniv, Terrain* ter);

/**
@brief change le numero du terrain
@param element_niveau* eleniv, entier nbr
@return none
*/
void elementNiveauSetNumTer(element_niveau* eleniv, int nbr);

/**
@brief change le terrain suivant (en gros le 2e terrain suivant devient le terrain suivant direct puisque qu'avant on a probablement changé de terrain)
@param element_niveau* eleniv, element_niveau* suivant
@return none
*/
void elementNiveauSetSuivant(element_niveau* eleniv, element_niveau* suivant);

/**
@brief change le terrain precedent (en gros l'ancien actuel devient le precedent, puisque qu'avant on a problement changé de terrain)
@param element_niveau* eleniv, element_niveau* precedant
@return none
*/
void elementNiveauSetPrecedant(element_niveau* eleniv, element_niveau* precedant);

/**
@brief cherche un terrain par rapport à son numéro
@param element_niveau* eleniv, entier numTer
@return pointeur sur Terrain
*/
Terrain* elementNiveauChercheTerrain(element_niveau* eleniv,int numTer);

#endif
